今天來教大家在gitea推commit上去時,防止git commit被偽造。
在自己git的名字跟信箱都被公開的情況下,每個人的commit都可能被偽造。
要如何保證這些commit是由你的電腦下的呢?
brew install gnupg
gpg --full-generate-key
請選擇你要使用的金鑰種類:
(1) RSA 和 RSA (預設)
(2) DSA 和 Elgamal
(3) DSA (僅能用於簽署)
(4) RSA (僅能用於簽署)
你要選哪一個? 1
再來會要輸入 Key 的長度,github 是建議 4096 位元
RSA 金鑰的長度可能介於 1024 位元和 4096 位元之間
所以在gitea上也選擇4096
你想要用多大的金鑰尺寸? (2048) 4096
你所要求的金鑰尺寸是 4096 位元
通常會使用0不會過期。
請指定這把金鑰的有效期限是多久.
0 = 金鑰不會過期
<n> = 金鑰在 n 天後會到期
<n>w = 金鑰在 n 週後會到期
<n>m = 金鑰在 n 月後會到期
<n>y = 金鑰在 n 年後會到期
金鑰的有效期限是多久? (0) 0
確認以上是否正確。
以上正確嗎? (y/N) Y
確認完後會要你輸入基本資料及安全密碼。
GnuPG 需要建構使用者 ID 以識別你的金鑰.
真實姓名: <Name>
電子郵件地址: <Email>
註釋:
你選擇了這個使用者 ID:
"<Name> <<Email>>"
變更姓名(N), 註釋(C), 電子郵件地址(E)或確定(O)/退出(Q)? O
接下來,會出現亂碼的畫面
會叫你輸入密碼,至少要8碼
然後要記住這個密碼讓我們先取名「A密碼」
然後要輸入兩次
到這邊資料都輸入完了,等它產生完就會看到如下的畫面。
在這個步驟需要等一下
我們需要產生大量的隨機位元組. 這個時候你可以多做一些事情
(像是敲打鍵盤, 移動滑鼠, 讀寫硬碟之類的)
這會讓隨機數字產生器有更多的機會獲得夠多的亂數.
我們需要產生大量的隨機位元組. 這個時候你可以多做一些事情
(像是敲打鍵盤, 移動滑鼠, 讀寫硬碟之類的)
這會讓隨機數字產生器有更多的機會獲得夠多的亂數
我們需要產生大量的隨機位元組. 這個時候你可以多做一些事情
(像是敲打鍵盤, 移動滑鼠, 讀寫硬碟之類的)
這會讓隨機數字產生器有更多的機會獲得夠多的亂數
我們需要產生大量的隨機位元組. 這個時候你可以多做一些事情
(像是敲打鍵盤, 移動滑鼠, 讀寫硬碟之類的)
這會讓隨機數字產生器有更多的機會獲得夠多的亂數
gpg: /Users/user/.gnupg/trustdb.gpg: 建立了信任資料庫
gpg: 金鑰 xxxxxxxxxxxxxxx 已標記成徹底信任了
gpg: 目錄 '/Users/user/.gnupg/openpgp-revocs.d' 已建立
gpg: revocation certificate stored as '/Users/user/.gnupg/openpgp-revocs.d/xxxxxxxxxxxxxxx.rev'
公鑰和私鑰已建立及簽署.
pub rsa4096 2020-09-10 [SC]
BD4FF21F12790D69E122699AAB4E1F7BA077B37A
uid "<Name> <<Email>>"
sub rsa4096 2020-09-10 [E]
Fingerprint: BD4FF21F12790D69E122699AAB4E1F7BA077B37A
Long key ID: AB4E1F7BA077B37A
Short key ID: A077B37A
可見兩個不同長度的 ID 只是截取 Fingerprint 的部分方便辨識而已,當有碰撞時就會變長了。
提交公鑰到 Github / Gitlab / Bitbucket
使用 gpg --list-secret-keys 去顯示出所有包含公要與私鑰的 GPG Keys。
將要使用的 Fingerprint (指紋) 複製起來,以下範例的 Fingerprint 為 BD4FF21F12790D69E122699AAB4E1F7BA077B37A 。
gpg --list-secret-keys
gpg: 正在檢查信任資料庫
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: 深度: 0 有效: 1 已簽署: 0 信任: 0-, 0q, 0n, 0m, 0f, 1u
/Users/user/.gnupg/pubring.kbx
---------------------------------
sec rsa4096 2020-09-10 [SC]
BD4FF21F12790D69E122699AAB4E1F7BA077B37A
uid [ultimate] <Name> <<Email>>
ssb rsa4096 2020-09-10 [E]
執行 gpg --armor --export <Fingerprint>
,承上範例的 Fingerprint 如下
gpg --armor --export BD4FF21F12790D69E122699AAB4E1F7BA077B37A
公鑰輸出如下:
-----BEGIN PGP PUBLIC KEY BLOCK-----
OVG48HWL9GV5P8HG1ZE51VUAJR47WF9H5UGRGX01ZB9I6LVRV55
B7SF1KY5H026LT7J9FL9G67I1EMPR4UIJAA6W3QPWRB3QGYRJ0DP
AMR2XJAI69NM5LBIZJR7GHY7JPI5O1OA07D008M7BDSTP3VMS0ND
FWB1BPVR277S0611F6NQJCSJLRBTW9CJ54WN31ZK3JR0N
=SSDQ
-----END PGP PUBLIC KEY BLOCK-----
再來,請將它貼到你的 Gitea 設定中的 GPG Key 中。
按下 管理 GPG 金鑰 >> 增加金鑰,金鑰內容貼上!
url路徑
${your_gitea_domain}/user/settings/keys
git 設定 signingkeygit config --global user.signingkey <Fingerprint>
# 僅限此倉庫
git config user.signingkey BD4FF21F12790D69E122699AAB4E1F7BA077B37A
# 全域設定
git config --global user.signingkey BD4FF21F12790D69E122699AAB4E1F7BA077B37A
之後每Commit 時加上 -S
就可以簽署囉
git commit -S -m "Add xxx.txt"
如果懶,不想每次都這樣做的話
# 僅限此倉庫
git config commit.gpgsign true
# 全域設定
git config --global commit.gpgsign true
在 Commit 過程中會要求要輸入 GPG 的安全密碼。
推上去遠端倉庫後,就可以在 Commit 紀錄中看到被標示為 Verified 了
再來就是因為Mac重開機後都會在叫你輸入一次金鑰
所以懶的話就
brew install pinentry-mac
如果不想再被新增key的話,將以下設定新增至 ~/.gnupg/gpg.conf
no-tty
以下設定新增至 ~/.gnupg/gpg-agent.conf
pinentry-program /usr/local/bin/pinentry-mac
清除背景執行的 gpg-agent
killall gpg-agent
再來就試著 commit&push到 gitea上確認吧
push後會跑出視窗需要輸入密碼,這裡就要輸入我們剛剛打的「A密碼」
另外在gitea的專案設定內選擇分支保護,有個Require Signed Commits可以勾選!
可以讓推上去的commit都必須有通過簽署的,以防止被偽造唷~
我試著讓同事們去使用GPG簽署commit,平均只要10分鐘內就可以完成設定囉,相信大家都可以做到的